'use strict'

/*
 * g.js 是 Generator函数，充当中间键，只处理跟微信交互的数据，不处理外围的业务层
 */

var sha1 = require('sha1')
var getRawBody = require('raw-body')	//通过这个 raw-body 模块，可以把这个this上的request对象，其实也就是http模块中的request对象，去拼装它的数据，最总可以拿到一个buffer的xml数据

var Wechat = require('./wechat')	//构造函数，所以第一个字母大写
var util = require('./util')


module.exports = function(opts, handler){
	var wechat = new Wechat(opts)

	/*
	 * 中间键是处理返回的信息的
	 * new的实例 Wechat，对票据的管理
	 * 需要在外面进行票据的存储和读取的逻辑
	 */

	return function *(next){
		
		// console.log(this.query) //GET 微信返回的值
		var that = this
		var token = opts.token;
		var signature = this.query.signature;
		var nonce = this.query.nonce;
		var timestamp = this.query.timestamp;
		var echostr = this.query.echostr;

		var str = [token, timestamp, nonce].sort().join('');

		var sha = sha1(str)

		//this.method 为KOA的方法
		if(this.method === 'GET'){
			if(sha === signature){
			this.body = echostr + ''
			}else{
				this.body = 'wrong'
			}
		}
		else if(this.method === 'POST'){
			if(sha !== signature){
				this.body = 'wrong'

				return false
			}

			
			
			 var data = yield getRawBody(this.req,{
			 	lengh:this.lengh,
			 	limit: '1mb',
			 	encoding: this.charset

			 })

			  // console.log(data.toString())

			 var content = yield util.parseXMLAsync(data)   //返回解析后的XML
			 // console.log('111\n')
			 // console.log(content)
			 // console.log('222\n')

			 var message = util.formatMessage(content.xml)

			 // console.log(message)

			 // if(message.MsgType === 'event'){
			 // 	if(message.Event === 'subscribe'){
			 // 		var now = new Date().getTime()

			 // 		that.status = 200
			 // 		that.type = 'application/xml'
			 // 		that.body = xml

			 // 	return
			 // 	}
			 // }
			 
			 this.weixin = message

			 yield handler.call(this, next)

			 wechat.reply.call(this)
		}

	}
}
